 package edu.upc.inmobiliaria.repository.jdbc;

import java.sql.ResultSet;
import java.sql.SQLException;
import java.text.SimpleDateFormat;
import java.util.Date;

import javax.sql.DataSource;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.dao.DataAccessException;
import org.springframework.dao.EmptyResultDataAccessException;
import org.springframework.jdbc.core.RowMapper;
import org.springframework.jdbc.core.simple.SimpleJdbcTemplate;
import org.springframework.stereotype.Repository;

import edu.upc.inmobiliaria.domain.InmuebleBean;
import edu.upc.inmobiliaria.domain.Usuario;
import edu.upc.inmobiliaria.domain.utils.EstadoInmuebleConstants;
import edu.upc.inmobiliaria.domain.utils.TipoOperacionConstants;
import edu.upc.inmobiliaria.repository.UsuarioRepository;

@Repository
public class JdbcUsuarioRepository implements UsuarioRepository {

	private SimpleJdbcTemplate simpleJdbcTemplate;

	@Autowired
	public JdbcUsuarioRepository(DataSource dataSource) {
		this.simpleJdbcTemplate = new SimpleJdbcTemplate(dataSource);
	}

	@Override
	public Usuario buscarUsuario(String email) {
		Usuario user = null;

		try {
			String sql = "select ID, EMAIL, NOMBRES, APE_PATERNO, APE_MATERNO, LOGIN, PASSWORD,ACTIVO from "
					+ " T_USUARIO where email = ?";
			RowMapper<Usuario> mapper = new RowMapper<Usuario>() {
				public Usuario mapRow(ResultSet rs, int rowNum)
						throws SQLException {
					Long id = rs.getLong("ID");
					String email = rs.getString("EMAIL");
					String nombres = rs.getString("NOMBRES");
					String apePaterno = rs.getString("APE_PATERNO");
					String apeMaterno = rs.getString("APE_MATERNO");
					String login = rs.getString("LOGIN");
					String password = rs.getString("PASSWORD");
					String activado = rs.getString("ACTIVO");
					Usuario usuario = Usuario.crearUsuario(id, email, nombres,
							apePaterno, apeMaterno, login, password,activado);
					
					return usuario;
					
				}
			};
			user = this.simpleJdbcTemplate.queryForObject(sql, mapper, email);
		} catch (EmptyResultDataAccessException ex) {
			return null;
		}
		
		return user;
		
	}

	@Override
	public void grabarUsuario(Usuario user) {
		Date fechaActual = new Date();
		SimpleDateFormat formato = new SimpleDateFormat("yyyy-MM-dd");
		String cadenaFecha = formato.format(fechaActual);
		String activo="1";
		String session="0";
		
		String sql = "insert into T_USUARIO (ID, EMAIL, NOMBRES, APE_PATERNO, APE_MATERNO, LOGIN, PASSWORD," +
				" ACTIVO, FECREG,SESSION) "
				+ "values(?,?,?,?,?,?,?,?,?,?)";
		this.simpleJdbcTemplate.update(sql, user.getId(), user.getEmail(),
				user.getNombres(), user.getApePaterno(), user.getApeMaterno(),
				user.getLogin(), user.getPassword(),activo,cadenaFecha,session);
	}

	@Override
	public Long obtenerIdDisponible() {
		return this.simpleJdbcTemplate
				.queryForLong("select count(*)+1 from T_USUARIO");
	}

	@Override
	public Usuario logueoUsuario(final String login, final String password) {
		// TODO Auto-generated method stub
		Usuario user = null;

		try {
			String sql = "select ID, EMAIL, NOMBRES, APE_PATERNO, APE_MATERNO, SESSION, ACTIVO from "
					+ " T_USUARIO where LOGIN = ? and PASSWORD = ? and ACTIVO = ?";
			RowMapper<Usuario> mapper = new RowMapper<Usuario>() {
				public Usuario mapRow(ResultSet rs, int rowNum)
						throws SQLException {
					Long id = rs.getLong("ID");
					String email = rs.getString("EMAIL");
					String nombres = rs.getString("NOMBRES");
					String apePaterno = rs.getString("APE_PATERNO");
					String apeMaterno = rs.getString("APE_MATERNO");
					String session = rs.getString("SESSION");
					String activado = rs.getString("ACTIVO");
					Usuario usuario = Usuario.crearUsuario(id, email, nombres,
							apePaterno, apeMaterno, login, password,activado);
					
					return usuario;
					
				}
			};
			user = this.simpleJdbcTemplate.queryForObject(sql, mapper, login, password, "1");
			if (user.getSession()!=null){
				System.out.println("Usuario "+user.getLogin()+" se encuentra en session");
				return null;	
			}
			else{
				user.setSession((Math.random()*100000000)+"");
				
			}
		} catch (EmptyResultDataAccessException ex) {
			return null;
		}
		
		return user;
		
	}
	
	private String getRandomNumber() {
		int aleatorio = (int)(Math.random()*100000000);
		return null;
	}

	public void setUsuario(Usuario user) {
		Date fechaActual = new Date();
		SimpleDateFormat formato = new SimpleDateFormat("yyyy-MM-dd");
		String cadenaFecha = formato.format(fechaActual);
		String activo="1";
		String session="0";
		
		String sql = "insert into T_USUARIO (ID, EMAIL, NOMBRES, APE_PATERNO, APE_MATERNO, LOGIN, PASSWORD," +
				" ACTIVO, FECREG,SESSION) "
				+ "values(?,?,?,?,?,?,?,?,?,?)";
		this.simpleJdbcTemplate.update(sql, user.getId(), user.getEmail(),
				user.getNombres(), user.getApePaterno(), user.getApeMaterno(),
				user.getLogin(), user.getPassword(),activo,cadenaFecha,session);
	}

	public boolean altaUsuario(String usuario, String password, String perfil) {		
		try {
			String sql = "update T_USUARIO set ACTIVO=? , PERFIL =? where LOGIN = ? and PASSWORD = ? and SESSION ='0'";
			this.simpleJdbcTemplate.update(sql,1,usuario,password, perfil);
		} catch (DataAccessException e) {
			return false;
		}
		return true;
	}

	public boolean bajaUsuario(String usuario) {		
		try {
			String sql = "update T_USUARIO set ACTIVO=? where LOGIN = ?";
			this.simpleJdbcTemplate.update(sql,0,usuario);
		} catch (DataAccessException e) {
			return false;
		}
		return true;
	}

	public boolean bajaAutoUsuario(String usuario) {		
		try {
			String sql = "update T_USUARIO set ACTIVO=? where LOGIN = ? and (DATEDIFF(CURDATE(),FECREG))>=3";
			this.simpleJdbcTemplate.update(sql,0,usuario);
		} catch (DataAccessException e) {
			return false;
		}
		return true;
	}

	public boolean logoutUsuario(String usuario) {		
		try {
			String sql = "update T_USUARIO set SESSION=? where LOGIN = ?";
			this.simpleJdbcTemplate.update(sql,1,usuario);
		} catch (DataAccessException e) {
			return false;
		}
		return true;
	}
	
}
